Øvelse 6

a)
i denne del af øvelsen skal skal der reqestes og frigives et interupt. Selve Reqesten af interrupten sker i initfunktionen
request_irq(IRQ,myInteruptHandler,IRQF_TRIGGER_RISING,"gpio",NULL);

i exitfunktionen frigives interrupten igen ved at bruge funktionen (se neden for). Det er vigtigt at frigive vores interrupt igen når modulet lukkes for ikke fortsat at optage denne
free_irq(IRQ,NULL);

ved at bruge dmesg der printer kerne bufferen kan vi se den IQR vi har fået tildelt, eller kan vi bruge cat/proc/interrupts til at finde vores IRQ.
vi kan her se det er IRQ 290 der er blevet os tildelt.

b) Implementer ISR
Routinen skal indtil videre blot indeholde en printk(”IRQ event!!!\n); således at vi kan se at den faktisk bliver kaldt.

 static irqreturn_t myInteruptHandler(int irq, void *dev_id)
{
    printk("\n irq event \n");
    return IRQ_HANDLED;
}

vi kan ved at kigge på outputtet se at vores ISR er blevet kalt når GPIO benet bliver påvirket.

irq event
irq event
irq event
irq event
irq event
irq event
irq event
irq event
irq event


c) Implementer ”read”

til at implementerer read funktionen bruges wait_event ( se nedenfor ) denne står og venter til den får et wakup call fra ISR
grunden til at vi sætter vores wait_evet funktion inden get_value funktion er at vi herved vænter til dataen er klar
      wait_event_interruptible(wg, irqflag==1);
      g_value = gpio_get_value(gpio[minor].num);
      interruptflag = 0;


i vores ISR indsættes funktionen wake_up(se nedenfor) denne bruges til at vægge vores wait_event funktion.

request_irq(IRQ,myInteruptHandler,IRQF_TRIGGER_RISING,"gpio",NULL);


gennerelle overvejelser
  • Hvor skal request_irq ligges (init / open)?
i denne opgave har vi valgt at ligge request_irq i init funktionen dette medføre dog at at irq'en er i brug allerede fra initialiseringen af kerneobjektet
det havde været bædre at kalde funktionen i open() da vi herved kun ville bruge interruptet nå vi rent faktisk skulle bruge denne.
  • Hvor skal værdien af gpio’en læses (ISR / read)?
dette afhænger af situationen. i vores tilfælde er det nok at gøre det i read funktionen men var der tale om et tilfælde hvor det skal gøres inden at resultatet bliver overskrevet skal det gøres
i ISR.